# 案例：打开‘注册实例.html’页面（本地文件），完成以下操作
# 1). 填写主页面的注册信息（初始窗口）
# 2). 点击“注册A页面”链接（打开新窗口），填写注册A页面信息
# 3). （扩展）返回主窗口，点击“注册B页面”链接，填写注册B页面信息
# 核心：点击链接打开新窗口后，需切换到新窗口上下文，否则无法定位新窗口中的元素

# 从time模块导入sleep函数，用于操作间隔暂停（等待页面加载、窗口打开）
from time import sleep
# 从selenium库导入webdriver模块，用于创建浏览器驱动、控制浏览器
from selenium import webdriver
# 导入ActionChains类（此处未实际使用，保留原导入，可后续扩展）
from selenium.webdriver import ActionChains
# 导入By类：适配新版selenium，替代已弃用的find_element_by_*方法
from selenium.webdriver.common.by import By
# 从selenium导入Keys类（此处未实际使用，保留原导入，可后续扩展）
from selenium.webdriver.common.keys import Keys
# 导入WebDriverWait类（此处未实际使用，保留原导入，可后续扩展显式等待）
from selenium.webdriver.support.wait import WebDriverWait

# 1. 初始化并打开Chrome浏览器
# executable_path：指定ChromeDriver驱动的本地绝对路径（适配selenium3及以下版本）
driver = webdriver.Chrome(executable_path='D:/chrome_driver/chromedriver.exe')
# 注释：selenium4及以上版本推荐写法（无需手动指定驱动路径）
# 需提前安装 webdriver-manager 库（pip install webdriver-manager），自动匹配浏览器版本下载驱动
# driver = webdriver.Chrome() # 创建Chrome浏览器对象，后续通过该对象执行所有操作

# 放大浏览器窗口
# maximize_window()：将窗口调整为屏幕最大尺寸，避免元素因窗口过小被隐藏
driver.maximize_window()

# 2. 访问本地目标页面（注册实例.html）
# 定义本地文件路径：使用r前缀表示原始字符串，避免反斜杠被解析为转义字符
url = r"C:\Users\HP\Desktop\UI自动化测试\注册实例.html"
# get()方法：加载本地HTML文件（Chrome支持直接传入本地绝对路径）
driver.get(url)

# 暂停2秒：等待页面完全加载（本地页面加载快，确保主页面表单元素渲染完成）
sleep(2)

# ---------------------- 1). 填写主页面的注册信息（初始窗口上下文） ----------------------
# 定位主页面用户名输入框（id="user"），输入"admin"
# 修复：替换已弃用的find_element_by_css_selector→使用find_element(By.CSS_SELECTOR, 定位器)
driver.find_element(By.CSS_SELECTOR, "#user").send_keys("admin")

# 定位主页面密码输入框（id="password"），输入"123456"
driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")

# 定位主页面电话号码输入框（id="tel"），输入"13012345678"
driver.find_element(By.CSS_SELECTOR, "#tel").send_keys("13012345678")

# 定位主页面电子邮件输入框（id="email"），输入"123@qq.com"
driver.find_element(By.CSS_SELECTOR, "#email").send_keys("123@qq.com")

# 暂停1秒：观察主页面输入效果，为打开新窗口做准备
sleep(1)

# ---------------------- 2). 填写注册A页面的注册信息（新窗口上下文） ----------------------
# 步骤1：点击“注册A页面”链接（打开新窗口）
# 定位链接：通过partial_link_text（模糊匹配链接文本）定位包含“A网页”的链接
# 修复：替换已弃用的find_element_by_partial_link_text→使用find_element(By.PARTIAL_LINK_TEXT, 文本)
# 作用：点击后会在新的浏览器窗口中打开注册A页面
driver.find_element(By.PARTIAL_LINK_TEXT, "A网页").click()

# 步骤2：切换到注册A页面的新窗口（核心操作，原代码缺失导致定位失败）
# 原理：浏览器打开新窗口后，driver默认仍停留在原窗口，需手动切换到新窗口
# 获取当前所有打开的窗口句柄（句柄是窗口的唯一标识，返回列表，顺序为窗口打开顺序）
window_handles = driver.window_handles
# 切换到最新打开的窗口（列表最后一个元素，索引为-1）
driver.switch_to.window(window_handles[-1])

# 暂停2秒：等待新窗口（注册A页面）完全加载
sleep(2)

# 步骤3：填写注册A页面的表单（此时上下文已切换到新窗口，可定位窗口内元素）
# 用户名（id="userA"），输入"1111"
driver.find_element(By.CSS_SELECTOR, "#userA").send_keys("1111")

# 密码（id="passwordA"），输入"123456"
driver.find_element(By.CSS_SELECTOR, "#passwordA").send_keys("123456")

# 电话号码（id="telA"），输入"13012345678"
driver.find_element(By.CSS_SELECTOR, "#telA").send_keys("13012345678")

# 电子邮件（id="emailA"），输入"123@qq.com"
driver.find_element(By.CSS_SELECTOR, "#emailA").send_keys("123@qq.com")

# 暂停1秒：观察注册A页面输入效果
sleep(1)

# ---------------------- 3). 填写注册B页面的注册信息（扩展，完成完整需求） ----------------------
# 步骤1：切换回主窗口（需先返回主窗口，才能点击“注册B页面”链接）
# 切换到第一个窗口（主窗口，句柄列表第一个元素，索引为0）
driver.switch_to.window(window_handles[0])

# 暂停1秒：等待主窗口激活
sleep(1)

# 步骤2：点击“注册B页面”链接（打开新窗口，假设链接文本包含“B网页”）
driver.find_element(By.PARTIAL_LINK_TEXT, "B网页").click()

# 步骤3：切换到注册B页面的新窗口（最新打开的窗口，句柄列表最后一个元素）
new_window_handles = driver.window_handles  # 重新获取所有窗口句柄（包含主窗口、A窗口、B窗口）
driver.switch_to.window(new_window_handles[-1])

# 暂停2秒：等待注册B页面完全加载
sleep(2)

# 步骤4：填写注册B页面的表单
# 用户名（id="userB"），输入"2222"
driver.find_element(By.CSS_SELECTOR, "#userB").send_keys("2222")

# 密码（id="passwordB"），输入"654321"
driver.find_element(By.CSS_SELECTOR, "#passwordB").send_keys("654321")

# 电话号码（id="telB"），输入"13887654321"
driver.find_element(By.CSS_SELECTOR, "#telB").send_keys("13887654321")

# 电子邮件（id="emailB"），输入"456@qq.com"
driver.find_element(By.CSS_SELECTOR, "#emailB").send_keys("456@qq.com")

# （可选）延长暂停时间观察最终效果，然后关闭所有窗口
sleep(3)

# 关闭所有浏览器窗口并释放资源
driver.quit()